import org.apache.spark.{SparkConf, SparkContext}

object WordCount extends App {

  val sparkConf = new SparkConf()

  sparkConf.setAppName("Word Count")

    sparkConf.setMaster("local[4]")

  val sparkContext = new SparkContext(sparkConf)


    val data = sparkContext.textFile("data/words.txt")
//  val data = sparkContext.textFile("/user/lumia/input/data/words.txt")

  /** "_"代表每一行数据，执行`_.split("\\w")`后会返回一个String数组，
   * 使用flatMap可将数组扁平化
   * 例如 第一行数据 java,scala,python,spark
   * 执行_.split("\\W") 后，返回["java","scala","python","spark"]
   * 然后flatMap会将其扁平化，最终得到每个单词一行的结果，即：
   * java
   * scala
   * python
   * spark
   */
  val result = data.flatMap(_.split("\\W"))

    /** flatMap执行完后的结果是每个单词一行
     * 现在使用map对每个单词打上标记 1 ，转成（key，value）的形式，
     * key代表每个单词，value是 1 ，例如：java => (java,1)
     * 之后就可以按单词分组，然后对其value进行累加，即可统计每个单词出现的次数
     */
    .map(word => (word, 1))
    // 按key分组进行reduce，对value累加
    .reduceByKey((x, y) => x + y)
  // 对每行数据执行println函数，即可将结果打印输出到控制台
  result.foreach(println)
  //  result.take(result.count().toInt).foreach(println)

}
